package org.totoro.memory.oom;

/**
 * Java 允许应用程序通过 Direct ByteBuffer 直接访问堆外内存，许多高性能程序通过 Direct ByteBuffer
 * 结合内存映射文件（Memory Mapped File）实现高速 IO。
 * <p>
 * 原因分析
 * Direct ByteBuffer 的默认大小为 64 MB，一旦使用超出限制，就会抛出 Directbuffer memory 错误。
 * <p>
 * 解决方案
 * 1、Java 只能通过 ByteBuffer.allocateDirect 方法使用 Direct ByteBuffer，因此，可以通过 Arthas 等在线诊断工具拦截该方法进行排查。
 * 2、检查是否直接或间接使用了 NIO，如 netty，jetty 等。
 * 3、通过启动参数 -XX:MaxDirectMemorySize 调整 Direct ByteBuffer 的上限值。
 * 4、检查 JVM 参数是否有 -XX:+DisableExplicitGC 选项，如果有就去掉，因为该参数会使 System.gc() 失效。
 * 5、检查堆外内存使用代码，确认是否存在内存泄漏；或者通过反射调用 sun.misc.Cleaner 的 clean()
 * 方法来主动释放被 Direct ByteBuffer 持有的内存空间。
 * <p>
 * 6、内存容量确实不足，升级配置。
 *
 * @author daocr
 * @date 2020/3/2
 */
public class DirectBufferMemory {


    /**
     * --XX:MaxDirectMemorySize
     * @param args
     */
    public static void main(String[] args) {



    }

}
